iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

文章同步發表至 Medium

處理好資料之後先來寫隻 API 取得資料吧!要進行的步驟如下:

  1. Table 轉換成 Model
  2. 取得資料並回傳

1. 轉換 Model

這裡和昨天進行的步驟相同:

dotnet ef dbcontext scaffold "Host=localhost;Database=tourism;Username=postgres;Password=0000;" Npgsql.EntityFrameworkCore.PostgreSQL -o ./Models/Db -c TourismEntity -f

匯入成功後會看到像這樣的資料夾:

要注意的是,如果你沒有先安裝好 Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite 就執行的話,預設是不會幫你啟用 NetTopologySuite 的,Geometry 類型的資料也不會被讀取並轉換喔。

因此,請在開始之前確保你的程式碼中有使用到 UseNetTopologySuite()

// DbContext.cs`
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseNpgsql("Host=localhost;Database=tourism;Username=postgres;Password=0000;", 
                    x => x.UseNetTopologySuite());
    }
}

// Program.cs
builder.Services.AddDbContext<TourismEntity>(options => 
    options.UseNpgsql(builder.Configuration.GetConnectionString("Db"),
        s => s.UseNetTopologySuite()));

2. 取得資料並回傳

基本的設定這邊就不贅述,完成之後新建一隻 API,我取名為 ScenicSpotController

/// <summary> 景點 </summary>
[ApiController]
[Route("api/[controller]")]
public class ScenicSpotController : ControllerBase
{
    /// <summary> 所有景點清單 </summary>
    [HttpGet]
    [SwaggerResponse(HttpStatusCode.OK, typeof(List<ScenicSpotInfo>))]
    public IActionResult List()
    {
        var scenicSpots = _db.ScenicSpots.ToList();
        var scenicSpotInfos = scenicSpots.Select(s => new ScenicSpotInfo()
        {
            Id = s.Id,
            Name = s.Name,
            Telephone = s.Telephone ?? "",
            Address = s.Address ?? "",
            X = s.Geom.Centroid.X,
            Y = s.Geom.Centroid.Y,
            Type = s.Type ?? "未分類",
            Park = s.Park ?? "",
            Info = s.Info ?? "暫無詳細資訊",
            UpdateTime = s.UpdateTime
        }).ToList();
        return Ok(scenicSpotInfos);
    }
}

/// <summary> 景點資訊 </summary>
public class ScenicSpotInfo
{
    /// <summary> 代碼 </summary>
    public string Id { get; set; } = null!;
    
    /// <summary> 名稱 </summary>
    public string Name { get; set; } = null!;
    
    /// <summary> 電話 </summary>
    public string Telephone { get; set; } = null!;
    
    /// <summary> 地址 </summary>
    public string Address { get; set; } = null!;
    
    /// <summary> X 座標 </summary>
    public double X { get; set; }
    
    /// <summary> Y 座標 </summary>
    public double Y { get; set; }
    
    /// <summary> 景點類別 </summary>
    public string Type { get; set; } = null!;
    
    /// <summary> 停車資訊 </summary>
    public string Park { get; set; } = null!;
    
    /// <summary> 參觀資訊 </summary>
    public string Info { get; set; } = null!;
    
    /// <summary> 最後更新時間 </summary>
    public DateTime? UpdateTime { get; set; }
}

利用 Postman 打的結果如下:


上一篇
旅遊規劃小專案 1 - 匯入資料
下一篇
旅遊規劃小專案 3 - 網頁呈現
系列文
歡迎來到 GIS 的世界!30 天從後端開始學 GIS30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言